# student:xingqian
# week05：列表

# 一、内置数据结构：列表、元组、字典、集合
# （内置是指在代码中直接使用，使用前无需先导入）
# 1.元组：有序的不可变对象集合
# （一旦向一个元组赋对象，任何情况下这个元组都不可改变）
# 2.字典：无序的键/值对集合
# （字典会关联键和值，类似列表，可以动态收缩和扩展到任意大小）
# 3.集合：无序的唯一对象集合
# （可以把集合想象成唯一对象的无序集合，无序有重复）
# 4.列表：有序的可变对象集合
# （可以在任何时间通过增加、删除或修改对象来修改列表）

# 二、列表
# 列表总是用中括号包围，列表中包含的对象之间总是由逗号隔开
# 1.按字面创建列表
# 字面列表：直接将一个新对象赋给一个新列表，这个列表会一次性完成创建和填充
# prices = []                             # 将[]赋给一个名为prices的变量，来创建一个空列表
# temps = [32.0,33.4,43.8,23.9,27.6]           # 浮点数列表
# word = ['hello','world']                         # 字符串列表
# car_details = ['Toyota','PAV4',2.2,12345]            # 混合列表

# 2.检查一个对象是否在另一个对象中，用in
# vowels = ['a','e','i','o','u']
# # 检查一个单词：Milliways
# word = "Milliways"
# for letter in word:        # 取出单词中的各个字母
#     if letter in vowels:
#         print(letter)

# 3.只列出找到的唯一元音
# 3.1
# found = []          # 建一个空列表
# len(found)             # 利用"len"确认其中多少对象
# found.append('a')      # 使用append方法在运行时将对象添加到列表末尾
# len(found)              # 长度也会增加
# found                  # 确认对象是否在列表中
#
# # 3.2 可以使用not in检查列表中是否不存在某个对象
# if 'u' not in found:
#     found.append('u')             # 第一个的append调用会执行，因为'u'并不在其中
# found              # 如果再输入一次以上代码时，下一个'append'不会执行，因为'u'已经在列表中

# 3.3更新代码
# 需要另外一些代码在运行时填充found，不再是找到元音时立即显示，所以需要另一个for循环处理found中的字母
# vowels = ['a','e','i','o','u']
# word = "Milliways"
# found = []            # 需要增加代码——创建空列表
# for letter in word:        # 取出单词中的各个字母
#     if letter in vowels:
#         if letter not in found:       # 增加 not in 来确定是否更新found元音列表
#             found.append(letter)
# for vowel in found:       # 第一个'for'循环结束时，第二个循环开始运行，它会显示'word'中找到的元音
#     print(vowel)
#
# 修改代码，使其更有交互性
# 让用户提供一个单词（将搜索这个单词中的元音）
vowels = ['a','e','i','o','u']
word = input("请输入一个单词：")
found = []
for letter in word:
    if letter in vowels:
        if letter not in found:
            found.append(letter)
for vowel in found:
    print(vowel)

# 4.练习-->将don't panic!转换为字符串"on tap"
# 4.1 基础代码
# phrase = "don't panic!"       # 开始时只是一个字符串
# plist = list(phrase)          # 将字符串转换为列表
#
# new_phrase = ''.join(plist)    # 将列表转换为字符串
# print(plist)
# print(new_phrase)
#
# 4.2 拓展代码--->使用列表的基本方法
phrase = "don't panic!"
plist = list(phrase)

for i in range(4):     # 添加列表处理代码  # 某个操作完成多次，使用for循环
    plist.pop()         # 这个小循环从"plist"删除最后四个对象，不再有nic!
plist.pop(0)            # 删除o的开头d
plist.remove("'")       # 在列表中找到引号这个值，并把他删除
plist.extend([plist.pop(),plist.pop()])      # 交换列表末尾的两个对象位置，首先从对象删除这两个对象，然后使用删除的对象拓展列表
                                            # 这行代码的pop调用最先执行（从左到右）。第一个代表的是a，第二个代表的是p
plist.insert(2,plist.pop(3))           # 这行代码从列表删除空格，然后把它再插回到列表索引2的位置
new_phrase = ''.join(plist)
print(plist)
print(new_phrase)

# 5.中括号
# 正索引值从左到右数；负索引值从右到左数
#    0     1      2      3
# "Mike","Mary","Jan","Jack"
#   -4     -3     -2    -1
#
# 列表认识start（开始）；stop（结束）；step（步长值）
# start 表示开始索引值
# stop 表示到哪个索引值结束，但不包括这个索引值
# step 表示每一步大小

# 6.在列表中使用切片--->把"don't panic“转换为"on tap"-->使用中括号记法
phrase = "don't panic!"
plist = list(phrase)
new_phrase = ''.join(plist[1:3])        # 首先从plist中取出单词on
new_phrase = new_phrase+''.join([plist[5],plist[4],plist[7],plist[6]])
                          # 然后挑出我们需要的各个其他字母：空格，”t“，”a“，”p"
print(plist)
print(new_phrase)
#
# （4.2）和（6）两次拓展代码的区别：
# （4.2）使用pop,remove,extend,insert方法完成的列表会修改列表的原始状态
# （6)使用列表中括号记法和切片，从一个现有列表中抽取对象不会改变原来的列表，源数据仍保持不变

# 7.for循环--->列表
# 提供列表时，for循环知道列表从哪里开始，列表包含多少对象，以及列表在哪里结束
paranoid_android = 'Marvin'
letters = list(paranoid_android)
for char in letters:            # for循环会取letters列表中的各个对象，每次将一个字符赋给另一个变量，名为char
    print('\t',char)            # '/t'会让各个字符分行打印

# 8.for循环--->切片
# 使用中括号从列表在选择一个切片，for循环只迭代处理切片部分的对象
paranoid_android = 'Marvin,the paranoid android'
letters = list(paranoid_android)
for char in letters[:6]:            # 循环迭代处理列表中前6个对象的一个切片
    print('\t',char)
print()
for char in letters[-7:]:           # 循环迭代处理列表中后7个对象的一个切片
    print('\t'*2,char)               # ”*2“会在每个要打印的对象前面插入两个制表符
print()
for char in letters[12:20]:
    print('\t'* 3, char)
print()






